package com.ftg.learn.chapter08.rdbms.service;

import com.ftg.learn.chapter08.Student;
import com.ftg.learn.chapter08.rdbms.entity.RClazz;
import com.ftg.learn.chapter08.rdbms.entity.RStudent;
import com.ftg.learn.chapter08.rdbms.util.CommClass;
import com.ftg.learn.chapter08.rdbms.util.SexEnum;

import javax.swing.*;
import javax.xml.stream.XMLOutputFactory;
import java.util.Arrays;

/**
 * entity : 一般情况下，这个包里面的类全是pojo [除了属性只有属性的setter getter]
 * service : 业务处理
 * <p>
 * 我们要完成，
 * <p>
 * RstudentService 应该有你的全部学生信息
 * 管理 学生信息
 * 添加
 * 修改
 * 删除
 * 查看部分学生 (10)
 *
 * @author kangjx
 * @date 2023/1/4
 */
public class RstudentService {

    private int index = 0;

    /**
     * 全局变量
     * 这个类先装配到方法区，要为全局变量开辟空前，给定默认值
     * <p>
     * new 实例（）是从方法区里面创建 的镜像
     */
    private RStudent[] rStudents;

    private final int DEFAULT_SIZE = 10;

////    默认构造方法
//    //自己编写以后消失
//    public RstudentService(){
//        super();
//    }

    public RstudentService() {
    }

    public RstudentService(int capacity) {
        this.rStudents = new RStudent[DEFAULT_SIZE > capacity ? DEFAULT_SIZE : capacity];
    }

    /**
     * 物理代码错误
     * × 逻辑业务错误 ： 没有完成对id不重复的处理
     * 这个方法用来表示我们学校里面的新生入学方法
     * add() 有没有bug
     *
     * @param rStudent 学生信息
     * @return
     */
    public boolean add(RStudent rStudent) {

        //判断rStudent 信息里面的cno要存在


        if(rStudent.getClazzNo() != null){
//            判断存不存在
            RClazz clazz = RclazzService.getClazzByStuCno(rStudent.getClazzNo());
            boolean clazzExist = clazz == null ? true : false;
            if(clazzExist){
                throw new RuntimeException("对不起，当前学生分配的班级信息不存在!");
            }
        }

        boolean ist = this.checkSnoExists(rStudent.getSno());
        if(ist){
            //异常
            throw new RuntimeException("对不起，学生已存在了!");
        }

        if (null == this.rStudents) {
            this.rStudents = new RStudent[DEFAULT_SIZE];
        }

        if (this.index == this.rStudents.length) {
            int newLen = this.rStudents.length + (this.rStudents.length >> 1);
            this.rStudents = Arrays.copyOf(this.rStudents, newLen);
        }
        this.rStudents[this.index++] = rStudent;
        return true;
    }

    /**
     * 根据你给定我的sno来判断是否存在
     * @param sno  学号
     * @return
     */
    public boolean checkSnoExists(int sno){
        return CommClass.checkSnoExists(this.rStudents,0,this.index,sno);
//        for(int i = 0 ;i < this.index;i++){
//            if(this.rStudents[i].getSno() == sno){
//                return true;
//            }
//        }
//        return false;
    }

    /**
     * 新生入学的重载方法 , 当前学生没有分配班级
     *
     * @param sno  学号
     * @param name 姓名
     * @param sex  性别
     * @param age  年龄
     * @return
     */
    public boolean add(int sno, String name, SexEnum sex, int age) {
        return this.add(new RStudent(sno, name, sex, age, null));
    }

    /**
     * 学生的姓名查找
     * @param name 姓名
     * @return
     */
    public RStudent[] findStudentByName(String name){
        //空间换时间
        RStudent[] rs = new RStudent[this.index];

        int num = 0;
        for(int i = 0 ;i < this.index;i++){
            if(this.rStudents[i].getName().startsWith(name)){
                rs[num++] = this.rStudents[i];
            }
        }
        return Arrays.copyOf(rs,num);
    }

    /**
     * 年龄查找
     * @param start  开始
     * @param end    结束
     * @return
     */
    public RStudent[] findStudentByAge(int start,int end){
        //空间换时间
        RStudent[] rs = new RStudent[this.index];

        int num = 0;
        for(int i = 0 ;i < this.index;i++){
            if(this.rStudents[i].getAge() >= start && this.rStudents[i].getAge() < end){
                rs[num++] = this.rStudents[i];
            }
        }
        return Arrays.copyOf(rs,num);
    }

    /**
     * 性别查找
     * @return
     */
    public RStudent[] findStudentBySex(SexEnum sex){
        //空间换时间
        RStudent[] rs = new RStudent[this.index];

        int num = 0;
        for(int i = 0 ;i < this.index;i++){
            if(this.rStudents[i].getSex() == sex){
                rs[num++] = this.rStudents[i];
            }
        }
        return Arrays.copyOf(rs,num);
    }

    //0-1 1-100 CV
    //0-1 1-100
    //crud create update read delete ......
    public static void main(String[] args) {

        /**
         * 我们学校里面有三个班级
         */
        RClazz c1 = new RClazz(1001,"软件一班");
        RClazz c2 = new RClazz(1002,"软件一班");
        RClazz c3 = new RClazz(1003,"软件一班");
        RclazzService.addClazz(c1);
        RclazzService.addClazz(c2);
        RclazzService.addClazz(c3);

        RstudentService rs = new RstudentService();

        RStudent r1 = new RStudent();
        r1.setSno(1);
        r1.setName("李四");
        // man = "男"
        r1.setSex(SexEnum.man);

        r1.setAge(24);

        RStudent r2 = new RStudent(2,"张三",SexEnum.man,23,1001);
        RStudent r3 = new RStudent(3,"张四",SexEnum.women,23,1001);

       RClazz rs1 = RclazzService.getClazzByStuCno(r1.getClazzNo());
       System.out.println(rs1);

        /**
         * 我们学校有三个学生
         */
        rs.add(r2);
        rs.add(r1);
        rs.add(r3);


    }


}
